package in.model;
import in.lib.Debug;
import in.model.base.NetObject;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import com.esotericsoftware.kryo.serializers.TaggedFieldSerializer.Tag;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@ToString(includeFieldNames = true, callSuper = true)
public class Channel extends NetObject
{
public enum Type
{
PRIVATE_MESSAGE("net.app.core.pm"),
PATTER_CHANNEL("net.patter-app.room");
@Getter private final String typeId;
private Type(String typeId)
{
this.typeId = typeId;
}
public static Type getTypeById(String id)
{
Type[] vals = Type.values();
for (Type t : vals)
{
if (t.getTypeId().equals(id))
{
return t;
}
}
return null;
}
}
@Tag(0x01) @Getter @Setter private String title;
@Tag(0x02) @Getter @Setter private boolean isUnread;
@Tag(0x03) @Getter @Setter private SimpleUser owner;
@Tag(0x04) @Getter @Setter private Type type = Type.PRIVATE_MESSAGE;
@Tag(0x05) @Getter @Setter private boolean editable = true;
@Tag(0x06) @Getter @Setter private boolean subscribed = true;
@Tag(0x07) @Getter @Setter private boolean canWrite = true;
@Tag(0x08) @Getter @Setter private PrivateMessage recentMessage;
@Tag(0x09) @Getter @Setter private List<String> readers = new ArrayList<String>();
@Tag(0x0A) @Getter @Setter private boolean isPublic;
@Tag(0x0B) @Getter @Setter private List<SimpleUser> users = new ArrayList<SimpleUser>();
/**
* Parses the return API object into a post class using the default logged in user
* @param user The jsonobject post from the API
* @return The new Post object
*/
@Override public Channel createFrom(JsonObject channel)
{
try
{
setId(channel.get("id").getAsString());
isUnread = channel.get("has_unread").getAsBoolean();
if (channel.has("owner"))
{
owner = new User().createFrom(channel.get("owner").getAsJsonObject());
}
else
{
owner = new User();
}
type = Type.getTypeById(channel.get("type").getAsString());
editable = channel.get("you_can_edit").getAsBoolean();
subscribed = channel.get("you_subscribed").getAsBoolean();
canWrite = channel.get("writers").getAsJsonObject().get("you").getAsBoolean();
JsonArray readerIds = channel.get("writers").getAsJsonObject().get("user_ids").getAsJsonArray();
if (type == Type.PATTER_CHANNEL)
{
if (channel.get("readers").getAsJsonObject().has("public")
&& channel.get("writers").getAsJsonObject().has("any_user"))
{
boolean readerPublic = channel.get("readers").getAsJsonObject().get("public").getAsBoolean();
boolean writerPublic = channel.get("writers").getAsJsonObject().get("any_user").getAsBoolean();
isPublic = readerPublic && writerPublic;
}
}
if (channel.has("recent_message"))
{
recentMessage = new PrivateMessage().createFrom(channel.get("recent_message").getAsJsonObject());
if (recentMessage != null && recentMessage.getPoster() != null)
{
readers.add(recentMessage.getPoster().getId());
}
}
if (!readers.contains(owner.getId()) &&!TextUtils.isEmpty(owner.getId()))
{
readers.add(owner.getId());
}
for (JsonElement reader : readerIds)
{
if (!readers.contains(reader.getAsString()))
{
readers.add(reader.getAsString());
}
}
if (channel.has("annotations"))
{
JsonArray annotations = channel.get("annotations").getAsJsonArray();
for (JsonElement annotation : annotations)
{
if (annotation.getAsJsonObject().get("type").getAsString().equals("net.patter-app.settings"))
{
if (annotation.getAsJsonObject().get("value").getAsJsonObject().has("name"))
{
title = annotation.getAsJsonObject().get("value").getAsJsonObject().get("name").getAsString();
}
}
}
}
return this;
}
catch (Exception e)
{
Debug.out(e);
return null;
}
}
@Override public Channel createFrom(Parcel object)
{
setTitle(object.readString());
setUnread((Boolean)object.readValue(null));
setOwner((SimpleUser)object.readParcelable(SimpleUser.class.getClassLoader()));
setType((Type)object.readValue(null));
setEditable((Boolean)object.readValue(null));
setSubscribed((Boolean)object.readValue(null));
setCanWrite((Boolean)object.readValue(null));
setRecentMessage((PrivateMessage)object.readParcelable(PrivateMessage.class.getClassLoader()));
setReaders(object.readArrayList(String.class.getClassLoader()));
setPublic((Boolean)object.readValue(null));
setUsers(object.readArrayList(SimpleUser.class.getClassLoader()));
super.createFrom(object);
return this;
}
@Override public void writeToParcel(Parcel dest, int flags)
{
dest.writeString(getTitle());
dest.writeValue(isUnread());
dest.writeParcelable(getOwner(), 0);
dest.writeValue(getType());
dest.writeValue(isEditable());
dest.writeValue(isSubscribed());
dest.writeValue(isCanWrite());
dest.writeParcelable(getRecentMessage(), 0);
dest.writeList(getReaders());
dest.writeValue(isPublic());
dest.writeList(getUsers());
super.writeToParcel(dest, flags);
}
public static final Parcelable.Creator<Channel> CREATOR = new Creator<Channel>()
{
@Override public Channel[] newArray(int size)
{
return new Channel[size];
}
@Override public Channel createFromParcel(Parcel source)
{
return new Channel().createFrom(source);
}
};
}